#include "CVisualTraits.h"
#include "CEntity.h"



namespace csmodel
{

    CVisualTraits::CVisualTraits( IDimentions * anOwner, int _xStep, int _yStep, bool _oSnap )
    : owner( anOwner ), xStep( std::abs(_xStep) ), yStep( std::abs(_yStep) ), oSnap(_oSnap)
    {
        Dims = anOwner->GetGlobalDims();
    }

    //---------------------------------------------------------------------------

    CVisualTraits::~CVisualTraits() {}

    //---------------------------------------------------------------------------

    inline int GetNearest( int v1, int v2, int v)
    {
        if( std::abs( v - v1 ) < std::abs( v - v2 ) )
            return v1;
        return v2;
    }

    //---------------------------------------------------------------------------

    inline int Round( int v, int tol ) { return ( v / tol ) * tol; }

    //---------------------------------------------------------------------------

    inline int SnapVal( int v, int step ) { int tmp = Round( v, step ); return GetNearest( tmp, tmp+step, v ); }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetDims( const QRect & d )
    {
        if( Snap() )
        {
            QRect _d (d);
            _d.setLeft( SnapVal( _d.left(), xStep ) );
            _d.setRight( SnapVal(_d.right(), xStep ) );
            _d.setTop( SnapVal( _d.top(), yStep ) );
            _d.setBottom( SnapVal( _d.bottom(), yStep ) );
            owner->SetGlobalDims( _d );
        }
        else
            owner->SetGlobalDims( d );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetTop( int v )
    {
        QRect dims( GetDims() );
        SetBounds( dims.left(), v, dims.right(), dims.bottom() );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetBottom( int v )
    {
        QRect dims( GetDims() );
        SetBounds( dims.left(), dims.top(), dims.right(), v );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetLeft( int v )
    {
        QRect dims( GetDims() );
        SetBounds( v, dims.top(), dims.right(), dims.bottom() );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetRight( int v )
    {
        QRect dims( GetDims() );
        SetBounds( dims.left(), dims.top(), v, dims.bottom() );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetWidth( int v )
    {
        if( v > 0 )
        {
            QRect dims( GetDims() );
            SetBounds( dims.left(), dims.top(), dims.right()+v, dims.bottom() );
        }
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetHeight( int v )
    {
        if( v > 0 )
        {
            QRect dims( GetDims() );
            SetBounds( dims.left(), dims.top(), dims.right(), dims.bottom()+v );
        }
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::MoveTo( int x, int y )
    {
        QRect dims( GetDims() );
        dims.translate( x, y );
        SetDims( dims );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::Move( int dx, int dy )
    {
        QRect dims( GetDims() );
        dims.setLeft( dims.left()+dx );
        dims.setTop( dims.top()+dy );
        dims.setRight( dims.right()+dx );
        dims.setBottom( dims.bottom()+dy );
        SetDims( dims );
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::SetBounds( int left, int top, int right, int bottom )
    {
        QRect d( left, top, right, bottom );
        SetDims( d );
    }

    //---------------------------------------------------------------------------

    QRect CVisualTraits::GetDims() const
    {
        return owner->GetGlobalDims();
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::Snap( int _xStep, int _yStep, bool _oSnap )
    {
        xStep = _xStep;
        yStep = _yStep;
        oSnap = _oSnap;
        if( Snap() )
            SetDims(GetDims());
    }

    //---------------------------------------------------------------------------

    void CVisualTraits::WidthHeight( int w, int h )
    {
        QRect d( GetDims() );
        d.setWidth( w );
        d.setHeight( h );
        SetDims( d );
    }

}
